package xuecheng.spring.boot.start.common.json.impl;

import com.google.gson.*;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import xuecheng.spring.boot.start.common.json.JsonUtils;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * gson 实现
 *
 * @author PengXueCheng
 * @version 1.0.0
 * @mail yingcheng1016@gmail.com
 * @date 2019/4/25 10:11
 * @desc
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class JsonUtilsGsonImpl implements JsonUtils {

    private static final JsonUtilsGsonImpl INSTANCE = new JsonUtilsGsonImpl();
    /**
     * gson 实例对象
     */
    private final Gson GSON = new GsonBuilder().disableHtmlEscaping().create();

    public static JsonUtilsGsonImpl getInstance() {
        return INSTANCE;
    }

    @Override
    public String toJson(Object src) {
        return GSON.toJson(src);
    }

    @Override
    public <T> T fromJsonAsObject(String json, Class<T> classOfT) {
        return GSON.fromJson(json, classOfT);
    }

    @Override
    public <T> List<T> fromJsonAsArray(String json, Class<T> classOfT) {

        JsonElement jsonElement = JsonParser.parseString(json);
        JsonArray jsonArray = jsonElement.getAsJsonArray();
        List<T> list = new ArrayList<>();
        for (JsonElement element : jsonArray) {
            T t = GSON.fromJson(element, classOfT);
            list.add(t);
        }
        return list;
        //		// 创建一个 List<T> 的类型作为 json 字符串序列化类型
        //		TypeToken<List<T>> typeToken = new MyTypeToken<>();
        //		return GSON.fromJson(json, typeToken.getType());
    }

    @Override
    public String getAsString(String json, String memberName) {
        JsonElement jsonElement = getJsonElement(json, memberName);
        return GSON.fromJson(jsonElement, String.class);
    }

    /**
     * 解析 json 字符串作为一个 jsonObject, 返回指定字段的值
     *
     * @param json       要解析的 json 字符串
     * @param memberName 字段名
     * @return 字段值
     */
    private JsonElement getJsonElement(String json, String memberName) {
        JsonObject jsonObject = JsonParser.parseString(json).getAsJsonObject();
        return jsonObject.get(memberName);
    }

    @Override
    public int getAsInt(String json, String memberName) {
        JsonElement jsonElement = getJsonElement(json, memberName);
        return GSON.fromJson(jsonElement, int.class);
    }

    @Override
    public Date getAsDate(String json, String memberName) {
        JsonElement jsonElement = getJsonElement(json, memberName);
        return GSON.fromJson(jsonElement, Date.class);
    }

    @Override
    public boolean getAsBoolean(String json, String memberName) {
        JsonElement jsonElement = getJsonElement(json, memberName);
        return GSON.fromJson(jsonElement, boolean.class);
    }

    @Override
    public <T> T getAsObj(String json, String memberName, Class<T> classOfT) {
        JsonElement jsonElement = getJsonElement(json, memberName);
        return GSON.fromJson(jsonElement, classOfT);
    }

//	/**
//	 * typetoken
//	 *
//	 * @param <T>
//	 */
//	public class MyTypeToken<T> extends TypeToken<T> {
//	}

}
